package cn.itcast.bos.service.base.impl;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import cn.itcast.bos.dao.base.AreaRespository;
import cn.itcast.bos.domain.base.Area;
import cn.itcast.bos.service.base.AreaServcie;
@Service
@Transactional  //做增 删  改   必须开启事务管理
public class AreaServcieImpl implements AreaServcie {
//属性注入 Dao层
	@Autowired
	private AreaRespository areaRespository;
	//批量导入 区域数据   存储到数据库
	@Override
	public void saveBatch(List<Area> areas) {
		areaRespository.save(areas);	
	}
	
	//完成 分页条件查询功能
	@Override
	public Page<Area> pageQuery(int page, int rows, final Area area) {
		//1.完成 page  rows的数据封装   即:构造 pageable对象
		Pageable pageable = new PageRequest(page-1, rows);
		//2.构造条件查询对象
		Specification specification =new Specification<Area>() {
			@Override
			public Predicate toPredicate(Root<Area> root,
					CriteriaQuery<?> query, CriteriaBuilder cb) {
				//2.1创建一个集合  来存放条件对象
				List<Predicate> list = new ArrayList<Predicate>();
				//2.2添加条件
				if(StringUtils.isNotBlank(area.getProvince())){
					//根据省份查询    模糊查询
					Predicate p1 = cb.like(root.get("province").as(String.class), "%"+area.getProvince()+"%");
					list.add(p1);
				}
				if(StringUtils.isNotBlank(area.getCity())){
					//根据市  模糊查询
					Predicate p2 = cb.like(root.get("city").as(String.class), "%"+area.getCity()+"%");
					list.add(p2);
				}
				if(StringUtils.isNotBlank(area.getDistrict())){
					//根据区域 模糊查询
					Predicate p3 = cb.like(root.get("district").as(String.class), "%"+area.getDistrict()+"%");
					list.add(p3);
				}
				Predicate predicates = cb.and(list.toArray(new Predicate[0]));
				return predicates;
			}
		};
		
		//调用  dao 层  完成数据分页查询功能
		Page<Area> pageData =   areaRespository.findAll(specification,pageable);
		return pageData;
	}
//添加 区域信息
	@Override
	public void save(Area area) {
		areaRespository.save(area);
		
	}
	//删除区域信息

	@Override
	public void delBatch(String[] idArray) {
		//调用dao层 实现删除操作
		for (String idStr : idArray) {
			areaRespository.delete(idStr);
		}
	}
	/**
	 * 查询所有区域信息
	 */
	@Override
	public List<Area> findAll() {
		
		return areaRespository.findAll();
	}
	
	


}
